package com.zyh.scs.admin.controller;

import cn.hutool.core.util.StrUtil;
import com.zyh.scs.admin.service.UserPsnInfoService;
import com.zyh.scs.admin.service.impl.temporary.PullFanWeiTemporaryService;
import com.zyh.scs.admin.service.jd.JDService;
import com.zyh.scs.admin.service.jd.JdBatchComponent;
import com.zyh.scs.common.security.annotation.Inner;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;

/**
 * @author hwh
 * @ClassName: 定时任务Controller$
 * @Description: $
 * @Date $
 * @Version 1.0
 */
@RestController
@AllArgsConstructor
@RequestMapping("/sys-task")
@Tag(description = "sys-task", name = "定时任务Controller")
@Inner(value = false)
public class UserTaskController {


    private static final Logger log = LoggerFactory.getLogger(UserTaskController.class);

    private final PullFanWeiTemporaryService pullFanWeiTemporaryService;

    private final UserPsnInfoService psnInfoService;

    private final JDService jdService;

    private final JdBatchComponent jdBatchComponent;


    /**
     * 定时每天2点执行拉取泛微部门人员任职到临时表中
     */
    @GetMapping("/pullFanWei")
    @Operation(summary = "定时每天2点执行拉取泛微部门人员任职到临时表中", description = "定时每天2点执行拉取泛微部门人员任职到临时表中")
    public String pullFanWei() {
        //泛微临时表
        log.info("执行拉取泛微部门人员任职到临时表中 开始执行 执行时间: {}", LocalDateTime.now());
        pullFanWeiTemporaryService.pullFanWei();
        log.info("执行拉取泛微部门人员任职到临时表中 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 定时每天2点半执行拉取泛微部门人员任职到正式表中
     */
    @GetMapping("/insertNew")
    @Operation(summary = "定时每天2点半执行拉取泛微部门人员任职到正式表中", description = "定时每天2点半执行拉取泛微部门人员任职到正式表中")
    public String insertNew() {
        //泛微临时表
        log.info("拉取泛微部门人员任职到正式表中 开始执行 执行时间: {}", LocalDateTime.now());
        pullFanWeiTemporaryService.insertNew();
        log.info("拉取泛微部门人员任职到正式表中 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 定时每天3点执行拉取泛微更新用户到用户表中
     */
    @GetMapping("/updatePsnUser")
    @Operation(summary = "定时每天3点执行拉取泛微更新用户到用户表中", description = "定时每天3点执行拉取泛微更新用户到用户表中")
    public String updatePsnUser() {
        //泛微临时表
        log.info("执行拉取泛微更新用户到用户表中 开始执行 执行时间: {}", LocalDateTime.now());
        pullFanWeiTemporaryService.updatePsnUser();
        log.info("执行拉取泛微更新用户到用户表中 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 定时每天3点半执行拉取泛微时产生的预警和冻结
     */
    @GetMapping("/warmUser")
    @Operation(summary = "定时每天3点半执行拉取泛微时产生的预警和冻结", description = "定时每天3点半执行拉取泛微时产生的预警和冻结")
    public String warmUser() {
        //泛微临时表
        log.info("执行拉取泛微时产生的预警和冻结 开始执行 执行时间: {}", LocalDateTime.now());
        pullFanWeiTemporaryService.warmUser();
        log.info("执行拉取泛微时产生的预警和冻结 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }


    /**
     * 每月第一天 1点生成账单
     */
    @GetMapping("/insertBill")
    @Operation(summary = "每月第一天 1点生成账单", description = "每月第一天 1点生成账单")
    public String insertBill(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成账单 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成账单 开始执行 执行时间: {}", LocalDateTime.now());
        //生成交易流水
        psnInfoService.insertTransaction(now);
        //生成退款流水
        psnInfoService.insertDeduction(now);
////        //生成餐补流水
        psnInfoService.insertCard(now);
//        //生成现金流水
        psnInfoService.insertCash(now);
////        //生成月末流水
        psnInfoService.insertCardAll(now);
//        //业务账单
        psnInfoService.insertBusinessAccount(now);
        psnInfoService.insertPayMKBAccount(now);
        psnInfoService.insertPayJDAccount(now);
        psnInfoService.insertPayHDAccount(now);
        psnInfoService.insertMKBRechargeAccount(now);
        psnInfoService.insertBackend(now);
        psnInfoService.insertAccountPay(now);
        psnInfoService.insertJdBalanceAccount(now);
        log.info("每月第一天 1点生成账单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }


    /**
     * 定时5分钟推送满客宝部门/人员
     */
    @GetMapping("/pullMkb")
    @Operation(summary = "定时5分钟推送满客宝部门/人员", description = "定时5分钟推送满客宝部门/人员")
    public String pullMkb() {
        //泛微临时表
        log.info("定时5分钟推送满客宝部门/人员 开始执行 执行时间: {}", LocalDateTime.now());
        psnInfoService.pushMkbDepAndUser();
        log.info("定时5分钟推送满客宝部门/人员 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 定时1分钟京东定时任务退款
     */
    @GetMapping("/queryRefundOrder")
    @Operation(summary = "定时1分钟京东定时任务退款", description = "定时1分钟京东定时任务退款")
    public String queryRefundOrder() {
        //泛微临时表
        log.info("定时1分钟京东定时任务退款 开始执行 执行时间: {}", LocalDateTime.now());
        jdService.queryRefundOrder();
        log.info("定时1分钟京东定时任务退款 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成交易流水账单
     */
    @GetMapping("/insertTransaction")
    @Operation(summary = "每月第一天 1点生成交易流水账单", description = "每月第一天 1点生成交易流水账单")
    public String insertTransaction(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成交易流水账单 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成交易流水账单 开始执行 执行时间: {}", LocalDateTime.now());
        //生成交易流水
        psnInfoService.insertTransaction(now);
        log.info("每月第一天 1点生成交易流水账单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成退款流水
     */
    @GetMapping("/insertDeduction")
    @Operation(summary = "每月第一天 1点生成退款流水", description = "每月第一天 1点生成退款流水")
    public String insertDeduction(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成退款流水 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成退款流水 开始执行 执行时间: {}", LocalDateTime.now());
        psnInfoService.insertDeduction(now);
        log.info("每月第一天 1点生成退款流水 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成餐补流水
     */
    @GetMapping("/insertCard")
    @Operation(summary = "每月第一天 1点生成餐补流水", description = "每月第一天 1点生成餐补流水")
    public String insertCard(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成餐补流水 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成餐补流水 开始执行 执行时间: {}", LocalDateTime.now());
        //生成餐补流水
        psnInfoService.insertCard(now);
        log.info("每月第一天 1点生成餐补流水 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成现金流水
     */
    @GetMapping("/insertCash")
    @Operation(summary = "每月第一天 1点生成现金流水", description = "每月第一天 1点生成现金流水")
    public String insertCash(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成现金流水 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成现金流水 开始执行 执行时间: {}", LocalDateTime.now());
        //生成现金流水
        psnInfoService.insertCash(now);
        log.info("每月第一天 1点生成现金流水 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成月末流水
     */
    @GetMapping("/insertCardAll")
    @Operation(summary = "每月第一天 1点生成月末流水", description = "每月第一天 1点生成月末流水")
    public String insertCardAll(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成月末流水 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成月末流水 开始执行 执行时间: {}", LocalDateTime.now());
        //生成月末流水
        psnInfoService.insertCardAll(now);
        log.info("每月第一天 1点生成月末流水 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成业务账单
     */
    @GetMapping("/insertBusinessAccount")
    @Operation(summary = "每月第一天 1点生成业务账单", description = "每月第一天 1点生成业务账单")
    public String insertBusinessAccount(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成业务账单 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成业务账单 开始执行 执行时间: {}", LocalDateTime.now());
        //业务账单
        psnInfoService.insertBusinessAccount(now);
        log.info("每月第一天 1点生成业务账单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成满客宝消费账单
     */
    @GetMapping("/insertPayMKBAccount")
    @Operation(summary = "每月第一天 1点生成账单", description = "每月第一天 1点生成满客宝消费账单")
    public String insertPayMKBAccount(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成账单 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成满客宝消费账单 开始执行 执行时间: {}", LocalDateTime.now());
        psnInfoService.insertPayMKBAccount(now);
        log.info("每月第一天 1点生成满客宝消费账单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成京东消费账单
     */
    @GetMapping("/insertPayJDAccount")
    @Operation(summary = "每月第一天 1点生成京东消费账单", description = "每月第一天 1点生成京东消费账单")
    public String insertPayJDAccount(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成京东消费账单 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成京东消费账单 开始执行 执行时间: {}", LocalDateTime.now());
        psnInfoService.insertPayJDAccount(now);
        log.info("每月第一天 1点生成京东消费账单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成好点消费账单
     */
    @GetMapping("/insertPayHDAccount")
    @Operation(summary = "每月第一天 1点生成好点消费账单", description = "每月第一天 1点生成好点消费账单")
    public String insertPayHDAccount(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成好点消费账单 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成好点消费账单 开始执行 执行时间: {}", LocalDateTime.now());
        psnInfoService.insertPayHDAccount(now);
        log.info("每月第一天 1点生成好点消费账单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成满客宝充值账单
     */
    @GetMapping("/insertMKBRechargeAccount")
    @Operation(summary = "每月第一天 1点生成满客宝充值账单", description = "每月第一天 1点生成满客宝充值账单")
    public String insertMKBRechargeAccount(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成满客宝充值账单 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成满客宝充值账单 开始执行 执行时间: {}", LocalDateTime.now());
        psnInfoService.insertMKBRechargeAccount(now);
        log.info("每月第一天 1点生成满客宝充值账单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成后台充值账单
     */
    @GetMapping("/insertBackend")
    @Operation(summary = "每月第一天 1点生成后台充值账单", description = "每月第一天 1点生成后台充值账单")
    public String insertBackend(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成后台充值账单 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成后台充值账单 开始执行 执行时间: {}", LocalDateTime.now());
        psnInfoService.insertBackend(now);
        log.info("每月第一天 1点生成后台充值账单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成后台扣款账单
     */
    @GetMapping("/insertAccountPay")
    @Operation(summary = "每月第一天 1点生成后台扣款账单", description = "每月第一天 1点生成后台扣款账单")
    public String insertAccountPay(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成后台扣款账单 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成后台扣款账单 开始执行 执行时间: {}", LocalDateTime.now());
        psnInfoService.insertAccountPay(now);
        log.info("每月第一天 1点生成后台扣款账单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点生成京东结算账单
     */
    @GetMapping("/insertJdBalanceAccount")
    @Operation(summary = "每月第一天 1点生成京东结算账单", description = "每月第一天 1点生成京东结算账单")
    public String insertJdBalanceAccount(@RequestParam(required = false) String methodParamsValue) {
        LocalDateTime now = getLocalDateTime("每月第一天 1点生成京东结算账单 入参 methodParamsValue: {}", methodParamsValue);
        //泛微临时表
        log.info("每月第一天 1点生成京东结算账单 开始执行 执行时间: {}", LocalDateTime.now());
        psnInfoService.insertJdBalanceAccount(now);
        log.info("每月第一天 1点生成京东结算账单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点半生成京东拉取jd订单
     */
    @GetMapping("/pullOrdersFromJd")
    @Operation(summary = "每月第一天 1点半生成京东拉取jd订单", description = "每月第一天 1点半生成京东拉取jd订单")
    public String pullOrdersFromJd(@RequestParam(required = false) String methodParamsValue) {
        //泛微临时表
        log.info("每月第一天 1点半生成京东拉取jd订单 开始执行 执行时间: {}", LocalDateTime.now());
        jdBatchComponent.pullOrdersFromJd(methodParamsValue);
        log.info("每月第一天 1点半生成京东拉取jd订单 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    /**
     * 每月第一天 1点半生成拉取jd退款信息
     */
    @GetMapping("/pullRefundOrderFromJd")
    @Operation(summary = "每月第一天 1点半生成拉取jd退款信息", description = "每月第一天 1点半生成拉取jd退款信息")
    public String pullRefundOrderFromJd(@RequestParam(required = false) String methodParamsValue) {
        //泛微临时表
        log.info("每月第一天 1点半生成拉取jd退款信息 开始执行 执行时间: {}", LocalDateTime.now());
        jdBatchComponent.pullRefundOrderFromJd(methodParamsValue);
        log.info("每月第一天 1点半生成拉取jd退款信息 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }


    /**
     * 每月第一天 1点半拉去jd售后单信息
     */
    @GetMapping("/pullAfterServiceOrder")
    @Operation(summary = "每月第一天 1点半拉去jd售后单信息", description = "每月第一天 1点半拉去jd售后单信息")
    public String pullAfterServiceOrder(@RequestParam(required = false) String methodParamsValue) {
        //泛微临时表
        log.info("每月第一天 1点半拉去jd售后单信息 开始执行 执行时间: {}", LocalDateTime.now());
        jdBatchComponent.pullAfterServiceOrder(methodParamsValue);
        log.info("每月第一天 1点半拉去jd售后单信息 结束执行时间: {}", LocalDateTime.now());
        return "success";
    }

    private static @NotNull LocalDateTime getLocalDateTime(String logMsg, String methodParamsValue) {
        log.info(logMsg, methodParamsValue);
        LocalDateTime now = LocalDateTime.now();
        if (StrUtil.isNotBlank(methodParamsValue)) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
            YearMonth yearMonth = YearMonth.parse(methodParamsValue, formatter);
            // 获取该月的第一天并转换为 LocalDateTime，默认时间为午夜 (00:00)
            now = yearMonth.atDay(1).atStartOfDay();
        }
        return now;
    }
}
